﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Devart.Data.PostgreSql;

namespace Sistema_financiero
{
    public partial class frm_Cancelacion_Cuota : Form
    {
        public List<Entidades.Cuota> Lista_cuotas = new List<Sistema_financiero.Entidades.Cuota>();
        public List<Entidades.Pago> Lista_pagos = new List<Sistema_financiero.Entidades.Pago>();
        public List<Entidades.Pago> Lista_pagos_realizados = new List<Sistema_financiero.Entidades.Pago>();
        public List<Entidades.Pago> Lista_pagos_mas_realizados = new List<Sistema_financiero.Entidades.Pago>();
        public List<decimal> Listbox_pagos = new List<decimal>();
        public List<Entidades.Cliente> Lista_garantes = new List<Sistema_financiero.Entidades.Cliente>();


        public frm_Cancelacion_Cuota()
        {
            InitializeComponent();

        }

        private void maskedTextBox2_MaskInputRejected(object sender, MaskInputRejectedEventArgs e)
        {

        }

        private void tbx_Nombre_TextChanged(object sender, EventArgs e)
        {

        }

        private void tbx_Apellido_TextChanged(object sender, EventArgs e)
        {

        }

        private void label5_Click(object sender, EventArgs e)
        {

        }

        private void tbx_Instituto_informe_TextChanged(object sender, EventArgs e)
        {

        }

        private void textBox6_TextChanged(object sender, EventArgs e)
        {

        }

        private void label9_Click(object sender, EventArgs e)
        {

        }

        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        private void tbx_Comision_fija_TextChanged(object sender, EventArgs e)
        {

        }

        private void textBox13_TextChanged(object sender, EventArgs e)
        {

        }

        private void label14_Click(object sender, EventArgs e)
        {

        }

        private void tbx_Estado_TextChanged(object sender, EventArgs e)
        {

        }

        private void textBox18_TextChanged(object sender, EventArgs e)
        {

        }

        private void frm_Cancelacion_Cuota_Load(object sender, EventArgs e)
        {
            if (String.IsNullOrEmpty(tbx_Num_prestamo.Text))
            {
                btn_Pago_aceptar.Enabled = false;
            }
            else
            {
                btn_Pago_aceptar.Enabled = true;
            }
            tbx_Pago_importe.Enabled = false;
        }

        private void btn_Buscar_Click(object sender, EventArgs e)
        {
            frm_Buscar_Prestamo Buscar_prestamo = new frm_Buscar_Prestamo();
            Buscar_prestamo.ShowDialog();

            if (Buscar_prestamo.Prestamo_seleccionado != null)
            {
                tbx_Num_prestamo.Text = Convert.ToString(Buscar_prestamo.Prestamo_seleccionado.ID);
                tbx_Num_cliente.Text = Convert.ToString(Buscar_prestamo.Prestamo_seleccionado.ID_cliente);
                tbx_Nombre.Text = Convert.ToString(Buscar_prestamo.Prestamo_seleccionado.Nombre_cliente);
                tbx_Apellido.Text = Convert.ToString(Buscar_prestamo.Prestamo_seleccionado.Apellido_cliente);
                tbx_Importe.Text = Convert.ToString(Buscar_prestamo.Prestamo_seleccionado.Importe);
                tbx_Instituto_informe.Text = Convert.ToString(Buscar_prestamo.Prestamo_seleccionado.Instituto_informe);
                tbx_Numero_cuotas.Text = Convert.ToString(Buscar_prestamo.Prestamo_seleccionado.Num_Cuotas);
                mtbx_Punitorio.Text = Decimal_completo(Convert.ToString(Buscar_prestamo.Prestamo_seleccionado.Tasa_punitorio));
                mtbx_Sellado.Text = Decimal_completo(Convert.ToString(Buscar_prestamo.Prestamo_seleccionado.Sellado));
                mtbx_TEM.Text = Decimal_completo(Convert.ToString(Buscar_prestamo.Prestamo_seleccionado.TEM));
                tbx_Comision_por_cuota.Text = Convert.ToString(Buscar_prestamo.Prestamo_seleccionado.Comision_x_cuota);
                tbx_Comision_fija.Text = Convert.ToString(Buscar_prestamo.Prestamo_seleccionado.Comision_fija);
                tbx_Descuento.Text = Convert.ToString(Buscar_prestamo.Prestamo_seleccionado.Descuento);
                mtbx_Fecha.Text = Convert.ToString(Buscar_prestamo.Prestamo_seleccionado.Fecha_alta);
                tbx_Hora.Text = Convert.ToString(Buscar_prestamo.Prestamo_seleccionado.Hora_alta);
                mtbx_Alicuota_iva.Text = Decimal_completo(Convert.ToString(Buscar_prestamo.Prestamo_seleccionado.Alicuota_iva));
                tbx_Hora.Text = Convert.ToString(Buscar_prestamo.Prestamo_seleccionado.Hora_alta);
                tbx_Estado.BackColor = Color.SpringGreen;
                tbx_Estado.Text = "PENDIENTE";

                Lista_cuotas = Entidades.Cuota.Obtener_Cuotas(Buscar_prestamo.Prestamo_seleccionado.ID);
                Lista_pagos = Entidades.Pago.Obtener_pagos(Buscar_prestamo.Prestamo_seleccionado.ID);
                Lista_pagos_mas_realizados = Lista_pagos;

                dgv_Cuota.DataSource = null;
                dgv_Cuota.DataSource = Lista_cuotas;
                    
                dgv_Cuota.AutoResizeColumns();
                dgv_Cuota.Columns[0].Visible = false;
                tbx_Pago_importe.Enabled = true;

                if (String.IsNullOrEmpty(tbx_Num_prestamo.Text))
                {
                    btn_Pago_aceptar.Enabled = false;
                }
                else
                {
                    btn_Pago_aceptar.Enabled = true;
                }
                
                Actualizar_pagos();

                // Garantes
                using (PgSqlConnection conexion = new PgSqlConnection(frm_Menu.conexion))
                {
                    conexion.Unicode = true;
                    conexion.Open();
                    string sql = "select * from \"Prestamo_Garante\" as p, \"Cliente\" as c where p.id_garante = c.id_cliente and id_prestamo = " + Convert.ToString(Buscar_prestamo.Prestamo_seleccionado.ID);
                    PgSqlCommand comando = new PgSqlCommand(sql, conexion);
                    PgSqlDataReader reader = comando.ExecuteReader();
                    Entidades.Cliente garante;
                    while (reader.Read())
                    {
                        garante = new Sistema_financiero.Entidades.Cliente();
                        garante.ID = Convert.ToInt32(reader[2]);
                        garante.Apellido = Convert.ToString(reader[3]);
                        garante.Nombres = Convert.ToString(reader[4]);
                        Lista_garantes.Add(garante);
                    }

                    dgv_Garantes.DataSource = null;
                    dgv_Garantes.DataSource = Lista_garantes;
                    for (int i = 0; i < dgv_Garantes.ColumnCount; i++)
                    {
                        if (i == 1 || i == 2)
                        {
                            dgv_Garantes.Columns[i].Visible = true;
                        }
                        else
                        {
                            dgv_Garantes.Columns[i].Visible = false;
                        }
                    }

                    dgv_Garantes.AutoResizeColumns();

                    conexion.Close();
                }
                
            }
        }

        public void Actualizar_pagos()
        {
            int Ultima_cuota;            
            Ultima_cuota = 1;
            //Actualizar color de grilla          

            for (int i = 1; i <= dgv_Cuota.RowCount; i++)
            {
                DataGridViewRow Cuota_pagar = dgv_Cuota.Rows[i - 1];
                Cuota_pagar.DefaultCellStyle.BackColor = Color.White;
            }
            
            if (Lista_pagos_mas_realizados.Count > 0)
            {
                decimal monto_pagado;
                monto_pagado = 0;
                decimal monto;
                monto = 0;
                int cuota;
                cuota = 0;
                bool pagado_completo;
                pagado_completo = false;

                monto_pagado = Importe_total_pagado();

                foreach (Entidades.Cuota C in Lista_cuotas)
                {
                    monto = monto + C.Total;
                    if (monto <= monto_pagado)
                    {
                        cuota = cuota + 1;
                        if (monto == monto_pagado)
                        {
                            pagado_completo = true;
                        }
                        else
                        {
                            pagado_completo = false;
                        }
                    }
                    else
                    {
                        DataGridViewRow Cuota_pagar = dgv_Cuota.Rows[0];
                        Cuota_pagar.DefaultCellStyle.BackColor = Color.LemonChiffon;
                    }

                }

                if (cuota > 0)
                {
                    for (int i = 1; i <= cuota; i++)
                    {
                        if (i == cuota)
                        {
                            DataGridViewRow Cuota_pagar = dgv_Cuota.Rows[i - 1];
                            dgv_Cuota.CurrentCell = dgv_Cuota.Rows[cuota-1].Cells[1];
                            Cuota_pagar.DefaultCellStyle.BackColor = Color.SpringGreen;
                            if (Lista_cuotas.Count > cuota)
                            {
                                Ultima_cuota = cuota + 1;
                            }
                            else
                            {
                                Ultima_cuota = cuota;
                            }

                            if (pagado_completo == false)
                            {
                                dgv_Cuota.CurrentCell = dgv_Cuota.Rows[cuota-1].Cells[1];
                                DataGridViewRow Cuota_pagar2 = dgv_Cuota.Rows[i];
                                Cuota_pagar2.DefaultCellStyle.BackColor = Color.LemonChiffon;
                            }
                            
                        }
                        else
                        {
                            dgv_Cuota.CurrentCell = dgv_Cuota.Rows[cuota-1].Cells[1];
                            DataGridViewRow Cuota_pagar = dgv_Cuota.Rows[i - 1];
                            Cuota_pagar.DefaultCellStyle.BackColor = Color.SpringGreen;
                            Ultima_cuota = cuota;
                        }
                    }
                }

            }
            else
            {
                

            }
            tbx_Num_cuota.Text = Convert.ToString(Lista_cuotas[Ultima_cuota-1].Num_cuota);
            tbx_Importe_cuota.Text = Convert.ToString(Lista_cuotas[Ultima_cuota - 1].Capital + Lista_cuotas[Ultima_cuota - 1].Comision + Lista_cuotas[Ultima_cuota - 1].Intereses + Lista_cuotas[Ultima_cuota - 1].Gastos + Lista_cuotas[Ultima_cuota - 1].Iva);
            tbx_Punitorios.Text = Convert.ToString(Decimal.Round(Lista_cuotas[Ultima_cuota - 1].Punitorios) + Decimal.Round(Lista_cuotas[Ultima_cuota - 1].Punitorios_adic));
            tbx_Total.Text = Convert.ToString((Lista_cuotas[Ultima_cuota - 1].Total) - Importe_hasta_cuota(Ultima_cuota));
            tbx_Pago_importe.Text = tbx_Total.Text;
            tbx_Pagado.Text = Convert.ToString(Convert.ToDecimal(tbx_Importe_cuota.Text) + (Convert.ToDecimal(tbx_Punitorios.Text)) - Convert.ToDecimal(tbx_Total.Text));
            tbx_Falta.Text = Convert.ToString(Convert.ToDecimal(tbx_Importe_cuota.Text) + Convert.ToDecimal(tbx_Punitorios.Text) - Convert.ToDecimal(tbx_Pagado.Text));
            dgv_Cuota.RowHeadersVisible = false;
            dgv_Cuota.ClearSelection(); 

        }

        public string Decimal_completo(string cadena)
        {
            while (cadena.Length < 5)
            {
                cadena = cadena + "0";
            }
            return cadena;
        }

        public decimal Importe_total_pagado()
        {
            decimal monto;
            monto = 0;
            foreach (Entidades.Pago P in Lista_pagos_mas_realizados)
            {
                monto = monto + P.Valor;
            }
            return monto;
        }

        public decimal Importe_total_cuotas()
        {
            decimal monto;
            monto = 0;
            foreach (Entidades.Cuota C in Lista_cuotas)
            {
                monto = monto + C.Total;
            }
            return monto;
        }

        public decimal Importe_hasta_cuota(int cuota_actual)
        {
            decimal monto;
            decimal monto_cuota_anterior;
            monto = 0;
            monto_cuota_anterior = 0;
            foreach (Entidades.Cuota C in Lista_cuotas)
            {
                if (C.Num_cuota <= cuota_actual - 1)
                {
                    monto_cuota_anterior = monto_cuota_anterior + C.Total;
                }
                if (C.Num_cuota <= cuota_actual)
                {
                    monto = monto + C.Total;
                }
                else
                {
                    break;
                }
            }
            if (Importe_total_pagado() <= monto)
            {
                if ((monto_cuota_anterior - Importe_total_pagado()) != 0)
                {
                    if ((Importe_total_pagado() - Lista_cuotas[cuota_actual - 1].Total) > 0)
                    {
                        if ((Importe_total_pagado() - (Lista_cuotas[cuota_actual - 1].Total + monto_cuota_anterior)) >= 0)
                        {
                            monto = (Importe_total_pagado() - ((Lista_cuotas[cuota_actual - 1].Total)+monto_cuota_anterior));
                        }
                        else
                        {
                            monto = Importe_total_pagado() - Lista_cuotas[cuota_actual - 1].Total;
                            if (monto > Lista_cuotas[cuota_actual - 1].Total)
                            {
                                monto = monto - monto_cuota_anterior;
                                monto = Lista_cuotas[cuota_actual - 1].Total + monto;
                            }
                        }
                    }
                    else
                    {
                        monto = (Importe_total_pagado() - monto_cuota_anterior);
                    }
                }
                else
                {
                    monto = 0;
                }
            }
            else
            {
                monto = Importe_total_pagado() - monto;
            }
            return monto;
        }

        private void btn_Pago_aceptar_Click(object sender, EventArgs e)
        {
            if (!String.IsNullOrEmpty(tbx_Pago_importe.Text))
            {
                if (tbx_Pago_importe.Text != "0")
                {
                    if ((Importe_total_pagado() + Convert.ToDecimal(tbx_Pago_importe.Text)) <= Importe_total_cuotas())
                    {
                        Entidades.Pago Importe_pagado = new Sistema_financiero.Entidades.Pago();
                        Importe_pagado.Id_prestamo = Convert.ToInt32(tbx_Num_prestamo.Text);
                        Importe_pagado.Valor = Convert.ToDecimal(tbx_Pago_importe.Text);
                        Lista_pagos_realizados.Add(Importe_pagado);
                        Lista_pagos_mas_realizados.Add(Importe_pagado);
                        Listbox_pagos.Add(Importe_pagado.Valor);
                        lbx_Pagos.DataSource = null;
                        lbx_Pagos.DataSource = Listbox_pagos;
                        Actualizar_pagos();
                    }
                    else
                    {
                        MessageBox.Show("El pago que se intenta realizar supera al monto que queda por pagar", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
                else
                {
                    MessageBox.Show("No puede realizarse un pago de valor 0", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }

        private void btn_Quitar_Click(object sender, EventArgs e)
        {
            decimal Pago_borrar;
            Pago_borrar = -1;
            if (Listbox_pagos.Count > 0)
            {
                Pago_borrar = Convert.ToDecimal(lbx_Pagos.SelectedValue);
                foreach (Entidades.Pago P in Lista_pagos_mas_realizados)
                {
                    if (P.Valor == Pago_borrar)
                    {
                        Lista_pagos_mas_realizados.Remove(P);
                        break;
                    }
                    
                }
                foreach (Entidades.Pago P in Lista_pagos_realizados)
                {
                    if (P.Valor == Pago_borrar)
                    {
                        Lista_pagos_realizados.Remove(P);
                        break;
                    }

                }
                Listbox_pagos.Remove(Pago_borrar);
                lbx_Pagos.DataSource = null;
                lbx_Pagos.DataSource = Listbox_pagos;
                Actualizar_pagos();

                
            }
        }

        private void dgv_Cuota_CellClick(object sender, DataGridViewCellEventArgs e)
        {

        }

        private void dgv_Cuota_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

        }

        private void dgv_Cuota_CellContentDoubleClick(object sender, DataGridViewCellEventArgs e)
        {

        }

        private void dgv_Cuota_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {

        }

        private void dgv_Cuota_CellEnter(object sender, DataGridViewCellEventArgs e)
        {

        }

        private void dgv_Cuota_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
        {

        }

        private void dgv_Cuota_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
        {

        }

        private void dgv_Cuota_Click(object sender, EventArgs e)
        {

        }

        private void dgv_Cuota_KeyPress(object sender, KeyPressEventArgs e)
        {

        }

        private void dgv_Cuota_KeyUp(object sender, KeyEventArgs e)
        {

        }

        private void dgv_Cuota_KeyDown(object sender, KeyEventArgs e)
        {

        }

        private void tbx_Pago_importe_KeyPress(object sender, KeyPressEventArgs e)
        {
            Control.Textbox_restricciones.Permitir_solo_numeros(e);
        }

        private void btn_Aceptar_Click(object sender, EventArgs e)
        {

            if (Listbox_pagos.Count > 0)
            {
                foreach (Entidades.Pago P in Lista_pagos_realizados)
                {
                    Entidades.Pago.Guardar_pago(P.Id_prestamo, P.Valor);
                }

                MessageBox.Show("Los pagos han sido guardados con éxito", "Nuevos pagos", MessageBoxButtons.OK, MessageBoxIcon.Information);
                this.Close();
            }
            else
            {
                MessageBox.Show("No ha ingresado ningún pago", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void btn_Ver_Click(object sender, EventArgs e)
        {
            if (dgv_Garantes.RowCount != 0 && dgv_Garantes.CurrentRow != null)
            {
                int id_garante = Convert.ToInt32(dgv_Garantes[0, dgv_Garantes.CurrentRow.Index].Value);
                frm_Ver_Garante ver_garante = new frm_Ver_Garante(id_garante);
                ver_garante.ShowDialog();
            }
        }

    }
}
